<!DOCTYPE html>
<html>

<head>
  <title>Quarkus - Asynchronous messages between beans</title>
  <script id="adobe_dtm" src="https://www.redhat.com/dtm.js" type="text/javascript"></script>
  <script src="/assets/javascript/highlight.pack.js" type="text/javascript"></script>
  <META HTTP-EQUIV='Content-Security-Policy' CONTENT="default-src 'none'; script-src 'self' 'unsafe-eval' 'sha256-ANpuoVzuSex6VhqpYgsG25OHWVA1I+F6aGU04LoI+5s=' 'sha256-ipy9P/3rZZW06mTLAR0EnXvxSNcnfSDPLDuh3kzbB1w=' js.bizographics.com https://www.redhat.com assets.adobedtm.com jsonip.com https://ajax.googleapis.com https://www.googletagmanager.com https://www.google-analytics.com https://use.fontawesome.com; style-src 'self' https://fonts.googleapis.com https://use.fontawesome.com; img-src 'self' *; media-src 'self' ; frame-src https://www.googletagmanager.com https://www.youtube.com; frame-ancestors 'none'; base-uri 'none'; object-src 'none'; form-action 'none'; font-src 'self' https://use.fontawesome.com https://fonts.gstatic.com;">
  <META HTTP-EQUIV='X-Frame-Options' CONTENT="DENY">
  <META HTTP-EQUIV='X-XSS-Protection' CONTENT="1; mode=block">
  <META HTTP-EQUIV='X-Content-Type-Options' CONTENT="nosniff">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="Quarkus: Supersonic Subatomic Java">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:site" content="@QuarkusIO"> 
  <meta name="twitter:creator" content="@QuarkusIO">
  <meta property="og:url" content="https://quarkus.io/guides/reactive-messaging" />
  <meta property="og:title" content="Quarkus - Asynchronous messages between beans" />
  <meta property="og:description" content="Quarkus: Supersonic Subatomic Java" />
  <meta property="og:image" content="/assets/images/quarkus_card.png" />
  <link rel="canonical" href="https://quarkus.io/guides/reactive-messaging">
  <link rel="shortcut icon" type="image/png" href="/favicon.ico" >
  <link rel="stylesheet" href="https://quarkus.io/guides/stylesheet/config.css" />
  <link rel="stylesheet" href="/assets/css/main.css" />
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
  <link rel="alternate" type="application/rss+xml"  href="https://quarkus.io/feed.xml" title="Quarkus">
  <script src="https://quarkus.io/assets/javascript/goan.js" type="text/javascript"></script>
  <script src="https://quarkus.io/assets/javascript/hl.js" type="text/javascript"></script>
</head>

<body class="guides">
  <!-- Google Tag Manager (noscript) -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NJWS5L"
  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <!-- End Google Tag Manager (noscript) -->

  <div class="nav-wrapper">
  <div class="grid-wrapper">
    <div class="width-12-12">
      <input type="checkbox" id="checkbox" />
      <nav id="main-nav" class="main-nav">
  <div class="container">
    <div class="logo-wrapper">
      
        <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_600px_reverse.png" class="project-logo" title="Quarkus"></a>
      
    </div>
    <label class="nav-toggle" for="checkbox">
      <i class="fa fa-bars"></i>
    </label>
    <div id="menu" class="menu">
      <span>
        <a href="/get-started/" class="">Get Started</a>
      </span>
      <span>
        <a href="/guides/" class="active">Guides</a>
      </span>
      <span>
        <a href="/community/" class="">Community</a>
      </span>
      <span>
        <a href="/support/" class="">Support</a>
      </span>
      <span>
        <a href="/blog/" class="">Blog</a>
      </span>
      <span>
        <a href="https://code.quarkus.io" class="button-cta secondary white">Start Coding</a>
      </span>
    </div>
  </div>
      </nav>
    </div>
  </div>
</div>

  <div class="content">
    <div class="guide">
  <div class="width-12-12">
    <h1 class="text-caps">Quarkus - Asynchronous messages between beans</h1>
    <div class="hide-mobile toc"><ul class="sectlevel1">
<li><a href="#installing">Installing</a></li>
<li><a href="#consuming-events">Consuming events</a>
<ul class="sectlevel2">
<li><a href="#configuring-the-address">Configuring the address</a></li>
<li><a href="#replying">Replying</a></li>
<li><a href="#implementing-fire-and-forget-interactions">Implementing fire and forget interactions</a></li>
<li><a href="#dealing-with-messages">Dealing with messages</a></li>
</ul>
</li>
<li><a href="#sending-messages">Sending messages</a></li>
<li><a href="#putting-things-together-bridging-http-and-messages">Putting things together - bridging HTTP and messages</a></li>
</ul></div>
    <div>
      <div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Quarkus allows different beans to interact using asynchronous messages, enforcing loose-coupling.
The messages are sent to <em>virtual addresses</em>.
It offers 3 types of delivery mechanism:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>point-to-point - send the message, one consumer receives it. If several consumers listen to the address, a round robin is applied;</p>
</li>
<li>
<p>publish/subscribe - publish a message, all the consumers listening to the address are receiving the message;</p>
</li>
<li>
<p>request/reply - send the message and expect a response. The receiver can respond to the message in an asynchronous-fashion</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>All these delivery mechanism are non-blocking, and are providing one of the fundamental brick to build reactive applications.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
The asynchronous message passing feature allows replying to messages which is not supported by Reactive Messaging.
However, it is limited to single-event behavior (no stream) and to local messages.
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="installing"><a class="anchor" href="#installing"></a>Installing</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This mechanism uses the Vert.x EventBus, so you need to enable the <code>vertx</code> extension to use this feature.
If you are creating a new project, set the <code>extensions</code> parameter are follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">mvn io.quarkus:quarkus-maven-plugin:1.7.0.Final:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=vertx-quickstart \
    -Dextensions="vertx"
cd vertx-quickstart</code></pre>
</div>
</div>
<div class="paragraph">
<p>If you have an already created project, the <code>vertx</code> extension can be added to an existing Quarkus project with
the <code>add-extension</code> command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">./mvnw quarkus:add-extension -Dextensions="vertx"</code></pre>
</div>
</div>
<div class="paragraph">
<p>Otherwise, you can manually add this to the dependencies section of your <code>pom.xml</code> file:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="xml" class="language-xml hljs">&lt;dependency&gt;
    &lt;groupId&gt;io.quarkus&lt;/groupId&gt;
    &lt;artifactId&gt;quarkus-vertx&lt;/artifactId&gt;
&lt;/dependency&gt;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="consuming-events"><a class="anchor" href="#consuming-events"></a>Consuming events</h2>
<div class="sectionbody">
<div class="paragraph">
<p>To consume events, use the <code>io.quarkus.vertx.ConsumeEvent</code> annotation:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">package org.acme.vertx;

import io.quarkus.vertx.ConsumeEvent;

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class GreetingService {

    @ConsumeEvent                           <i class="conum" data-value="1"></i><b>(1)</b>
    public String consume(String name) {    <i class="conum" data-value="2"></i><b>(2)</b>
        return name.toUpperCase();
    }
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>If not set, the address is the fully qualified name of the bean, for instance, in this snippet it&#8217;s <code>org.acme.vertx.GreetingService</code>.</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>The method parameter is the message body. If the method returns <em>something</em> it&#8217;s the message response.</td>
</tr>
</table>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
<div class="paragraph">
<p>By default, the code consuming the event must be <em>non-blocking</em>, as it&#8217;s called on the Vert.x event loop.
If your processing is blocking, use the <code>blocking</code> attribute:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@ConsumeEvent(value = "blocking-consumer", blocking = true)
void consumeBlocking(String message) {
    // Something blocking
}</code></pre>
</div>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Asynchronous processing is also possible by returning either an <code>io.smallrye.mutiny.Uni</code> or a <code>java.util.concurrent.CompletionStage</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">package org.acme.vertx;

import io.quarkus.vertx.ConsumeEvent;

import javax.enterprise.context.ApplicationScoped;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import io.smallrye.mutiny.Uni;

@ApplicationScoped
public class GreetingService {

    @ConsumeEvent
    public CompletionStage&lt;String&gt; consume(String name) {
        // return a CompletionStage completed when the processing is finished.
        // You can also fail the CompletionStage explicitly
    }

    @ConsumeEvent
    public Uni&lt;String&gt; process(String name) {
        // return an Uni completed when the processing is finished.
        // You can also fail the Uni explicitly
    }
}</code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
<div class="title">Mutiny</div>
<div class="paragraph">
<p>The previous example uses Mutiny reactive types, if you&#8217;re not familiar with them, we recommend reading the <a href="getting-started-reactive#mutiny">Getting Started with Reactive guide</a>.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="sect2">
<h3 id="configuring-the-address"><a class="anchor" href="#configuring-the-address"></a>Configuring the address</h3>
<div class="paragraph">
<p>The <code>@ConsumeEvent</code> annotation can be configured to set the address:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@ConsumeEvent("greeting")               <i class="conum" data-value="1"></i><b>(1)</b>
public String consume(String name) {
    return name.toUpperCase();
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Receive the messages sent to the <code>greeting</code> address</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="replying"><a class="anchor" href="#replying"></a>Replying</h3>
<div class="paragraph">
<p>The <em>return</em> value of a method annotated with <code>@ConsumeEvent</code> is used as response to the incoming message.
For instance, in the following snippet, the returned <code>String</code> is the response.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@ConsumeEvent("greeting")
public String consume(String name) {
    return name.toUpperCase();
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>You can also return a <code>Uni&lt;T&gt;</code> or a <code>CompletionStage&lt;T&gt;</code> to handle asynchronous reply:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@ConsumeEvent("greeting")
public Uni&lt;String&gt; consume2(String name) {
    return Uni.createFrom().item(() -&gt; name.toUpperCase()).emitOn(executor);
}</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>You can inject an <code>executor</code> if you use the Context Propagation extension:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="code" class="language-code hljs">@Inject Executor executor;</code></pre>
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="implementing-fire-and-forget-interactions"><a class="anchor" href="#implementing-fire-and-forget-interactions"></a>Implementing fire and forget interactions</h3>
<div class="paragraph">
<p>You don&#8217;t have to reply to received messages.
Typically for a <em>fire and forget</em> interaction, the messages are consumed and the sender does not need to know about it.
To implement this, your consumer method just returns <code>void</code></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@ConsumeEvent("greeting")
public void consume(String event) {
    // Do something with the event
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="dealing-with-messages"><a class="anchor" href="#dealing-with-messages"></a>Dealing with messages</h3>
<div class="paragraph">
<p>As said above, this mechanism is based on the Vert.x event bus. So, you can also use <code>Message</code> directly:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@ConsumeEvent("greeting")
public void consume(Message&lt;String&gt; msg) {
    System.out.println(msg.address());
    System.out.println(msg.body());
}</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="sending-messages"><a class="anchor" href="#sending-messages"></a>Sending messages</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ok, we have seen how to receive messages, let&#8217;s now switch to the <em>other side</em>: the sender.
Sending and publishing messages use the Vert.x event bus:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">package org.acme.vertx;

import io.smallrye.mutiny.Uni;
import io.vertx.mutiny.core.eventbus.EventBus;
import io.vertx.mutiny.core.eventbus.Message;
import org.jboss.resteasy.annotations.jaxrs.PathParam;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/async")
public class EventResource {

    @Inject
    EventBus bus;                                       <i class="conum" data-value="1"></i><b>(1)</b>

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Path("{name}")
    public Uni&lt;String&gt; greeting(@PathParam String name) {
        return bus.&lt;String&gt;request("greeting", name)        <i class="conum" data-value="2"></i><b>(2)</b>
                .onItem().apply(Message::body);
    }
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Inject the Event bus</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>Send a message to the address <code>greeting</code>. Message payload is <code>name</code></td>
</tr>
</table>
</div>
<div class="paragraph">
<p>The <code>EventBus</code> object provides methods to:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><code>send</code> a message to a specific address - one single consumer receives the message.</p>
</li>
<li>
<p><code>publish</code> a message to a specific address - all consumers receive the messages.</p>
</li>
<li>
<p><code>send</code> a message and expect reply</p>
</li>
</ol>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">// Case 1
bus.sendAndForget("greeting", name)
// Case 2
bus.publish("greeting", name)
// Case 3
Uni&lt;String&gt; response = bus.&lt;String&gt;request("address", "hello, how are you?")
        .onItem().apply(Message::body);</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="putting-things-together-bridging-http-and-messages"><a class="anchor" href="#putting-things-together-bridging-http-and-messages"></a>Putting things together - bridging HTTP and messages</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Let&#8217;s revisit a greeting HTTP endpoint and use asynchronous message passing to delegate the call to a separated bean.
It uses the request/reply dispatching mechanism.
Instead of implementing the business logic inside the JAX-RS endpoint, we are sending a message.
This message is consumed by another bean and the response is sent using the <em>reply</em> mechanism.</p>
</div>
<div class="paragraph">
<p>First create a new project using:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">mvn io.quarkus:quarkus-maven-plugin:1.7.0.Final:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=vertx-http-quickstart \
    -Dextensions="vertx"
cd vertx-http-quickstart</code></pre>
</div>
</div>
<div class="paragraph">
<p>You can already start the application in <em>dev mode</em> using <code>./mvnw compile quarkus:dev</code>.</p>
</div>
<div class="paragraph">
<p>Then, creates a new JAX-RS resource with the following content:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/vertx/EventResource.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">package org.acme.vertx;

import io.smallrye.mutiny.Uni;
import io.vertx.mutiny.core.eventbus.EventBus;
import io.vertx.mutiny.core.eventbus.Message;
import org.jboss.resteasy.annotations.jaxrs.PathParam;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/async")
public class EventResource {

    @Inject
    EventBus bus;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Path("{name}")
    public Uni&lt;String&gt; greeting(@PathParam String name) {
        return bus.&lt;String&gt;request("greeting", name)            <i class="conum" data-value="1"></i><b>(1)</b>
                .onItem().apply(Message::body);            <i class="conum" data-value="2"></i><b>(2)</b>
    }
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>send the <code>name</code> to the <code>greeting</code> address and request a response</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>when we get the response, extract the body and send it to the user</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>If you call this endpoint, you will wait and get a timeout. Indeed, no one is listening.
So, we need a consumer listening on the <code>greeting</code> address. Create a <code>GreetingService</code> bean with the following content:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/vertx/GreetingService.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">package org.acme.vertx;

import io.quarkus.vertx.ConsumeEvent;

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class GreetingService {

    @ConsumeEvent("greeting")
    public String greeting(String name) {
        return "Hello " + name;
    }

}</code></pre>
</div>
</div>
<div class="paragraph">
<p>This bean receives the name, and returns the greeting message.</p>
</div>
<div class="paragraph">
<p>Now, open your browser to <a href="http://localhost:8080/async/Quarkus" class="bare">http://localhost:8080/async/Quarkus</a>, and you should see:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="text" class="language-text hljs">Hello Quarkus</code></pre>
</div>
</div>
<div class="paragraph">
<p>To better understand, let&#8217;s detail how the HTTP request/response has been handled:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>The request is received by the <code>hello</code> method</p>
</li>
<li>
<p>a message containing the <em>name</em> is sent to the event bus</p>
</li>
<li>
<p>Another bean receives this message and computes the response</p>
</li>
<li>
<p>This response is sent back using the reply mechanism</p>
</li>
<li>
<p>Once the reply is received by the sender, the content is written to the HTTP response</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>This application can be packaged using:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">./mvnw clean package</code></pre>
</div>
</div>
<div class="paragraph">
<p>You can also compile it as a native executable with:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">./mvnw clean package -Pnative</code></pre>
</div>
</div>
</div>
</div>
    </div>
  </div>
</div>

  </div>

  <div class="content project-footer">
  <div class="footer-section">
    <div class="logo-wrapper">
      <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_reverse.svg" class="project-logo" title="Quarkus"></a>
    </div>
  </div>
  <div class="grid-wrapper">
    <p class="grid__item width-3-12">Quarkus is open. All dependencies of this project are available under the <a href='https://www.apache.org/licenses/LICENSE-2.0' target='_blank'>Apache Software License 2.0</a> or compatible license.<br /><br />This website was built with <a href='https://jekyllrb.com/' target='_blank'>Jekyll</a>, is hosted on <a href='https://pages.github.com/' target='_blank'>Github Pages</a> and is completely open source. If you want to make it better, <a href='https://github.com/quarkusio/quarkusio.github.io' target='_blank'>fork the website</a> and show us what you’ve got.</p>

    
      <div class="width-1-12 project-links">
        <span>Navigation</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="/">Home</a></li>
          
            <li><a href="/guides">Guides</a></li>
          
            <li><a href="/community/#contributing">Contribute</a></li>
          
            <li><a href="/faq">FAQ</a></li>
          
            <li><a href="/get-started">Get Started</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Contribute</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://twitter.com/quarkusio">Follow us</a></li>
          
            <li><a href="https://github.com/quarkusio">GitHub</a></li>
          
            <li><a href="/security">Security&nbsp;policy</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Get Help</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://groups.google.com/forum/#!forum/quarkus-dev">Forums</a></li>
          
            <li><a href="https://quarkusio.zulipchat.com">Chatroom</a></li>
          
        </ul>
      </div>
    

    
      <div class="width-3-12 more-links">
        <span>Quarkus is made of community projects</span>
        <ul class="footer-links">
          
            <li><a href="https://vertx.io/" target="_blank">Eclipse Vert.x</a></li>
          
            <li><a href="https://microprofile.io" target="_blank">Eclipse MicroProfile</a></li>
          
            <li><a href="https://hibernate.org" target="_blank">Hibernate</a></li>
          
            <li><a href="https://netty.io" target="_blank">Netty</a></li>
          
            <li><a href="https://resteasy.github.io" target="_blank">RESTEasy</a></li>
          
            <li><a href="https://camel.apache.org" target="_blank">Apache Camel</a></li>
          
            <li><a href="https://code.quarkus.io/" target="_blank">And many more...</a></li>
          
        </ul>
      </div>
    
  </div>
</div>
  <div class="content redhat-footer">
  <div class="grid-wrapper">
    <span class="licence">
      <i class="fab fa-creative-commons"></i><i class="fab fa-creative-commons-by"></i> <a href="https://creativecommons.org/licenses/by/3.0/" target="_blank">CC by 3.0</a> | <a href="https://www.redhat.com/en/about/privacy-policy">Privacy Policy</a>
    </span>
    <span class="redhat">
      Sponsored by
    </span>
    <span class="redhat-logo">
      <a href="https://www.redhat.com/" target="_blank"><img src="/assets/images/redhat_reversed.svg"></a>
    </span>
  </div>
</div>


  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script>
  <script type="text/javascript" src="/assets/javascript/mobile-nav.js"></script>
  <script type="text/javascript" src="/assets/javascript/scroll-down.js"></script>
  <script src="/assets/javascript/satellite.js" type="text/javascript"></script>
  <script src="https://quarkus.io/guides/javascript/config.js" type="text/javascript"></script>
  <script src="/assets/javascript/search-filter.js" type="text/javascript"></script>
  <script src="/assets/javascript/back-to-top.js" type="text/javascript"></script>
</body>

</html>
